package com.second.hand.trading.server.utils;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.second.hand.trading.server.model.OrderModel;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * OrderTask类用于封装订单的延迟处理任务，实现了Delayed接口，
 * 可用于DelayQueue等延迟队列中，实现订单的定时处理（如超时自动取消）。
 */
public class OrderTask implements Delayed {
    /**
     * 任务的执行时间（时间戳，单位为毫秒）。
     * 表示该任务被消费的最早时间。
     */
    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private long time;

    /**
     * 需要延迟处理的订单对象
     */
    private OrderModel orderModel;

    /**
     * 无参构造方法，主要用于反序列化等场景
     */
    public OrderTask(){

    }

    /**
     * 构造方法
     * @param orderModel 需要延迟处理的订单对象
     * @param time 延迟时间（单位：秒），实际到期时间为当前时间+time秒
     */
    public OrderTask(OrderModel orderModel, long time) {
        this.orderModel = orderModel;
        this.time = System.currentTimeMillis()+1000*time;
    }

    /**
     * 获取距离任务到期还剩余的时间
     * @param unit 时间单位
     * @return 剩余延迟时间
     */
    @Override
    public long getDelay(TimeUnit unit) {
        // 返回剩余时间，单位为参数指定的时间单位
        return time - System.currentTimeMillis();
    }

    /**
     * 比较两个延迟任务的到期时间，用于队列排序
     * @param o 另一个延迟任务
     * @return 比较结果
     */
    @Override
    public int compareTo(Delayed o) {
        OrderTask Order = (OrderTask) o;
        long diff = this.time - Order.time;
        if (diff <= 0) {
            return -1;
        } else {
            return 1;
        }
    }

    /**
     * 获取任务的到期时间
     * @return 到期时间戳
     */
    public long getTime() {
        return time;
    }

    /**
     * 设置任务的到期时间
     * @param time 到期时间戳
     */
    public void setTime(long time) {
        this.time = time;
    }

    /**
     * 获取订单对象
     * @return 订单对象
     */
    public OrderModel getOrderModel() {
        return orderModel;
    }

    /**
     * 设置订单对象
     * @param orderModel 订单对象
     */
    public void setOrderModel(OrderModel orderModel) {
        this.orderModel = orderModel;
    }

    /**
     * 重写toString方法，便于日志输出和调试
     * @return 字符串表示
     */
    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("{");
        sb.append("\"time\":")
                .append(time);
        sb.append(",\"orderModel\":")
                .append(orderModel);
        sb.append('}');
        return sb.toString();
    }
}